
#include "dma1_mem_to_mem_driver.h"

#define ARR_LEN 1024

char src[ARR_LEN] = "Hello itheima\0";
char dst[ARR_LEN] = {0};

/**
 * 仅dma1支持内存到内存
 */
void dma1_config(void)
{
    // 开启dma1的外设时钟
    rcu_periph_clock_enable(RCU_DMA1);

    // 重置
    dma_deinit(DMA1, DMA_CH0);

    // 配置
    dma_single_data_parameter_struct dsdps;
    dma_single_data_para_struct_init(&dsdps);
    // 方向:存储器到存储器,
    dsdps.direction = DMA_MEMORY_TO_MEMORY;
    // 外设:内存到内存的源
    dsdps.periph_addr = (uint32_t)src;
    // 增长
    dsdps.periph_inc = DMA_PERIPH_INCREASE_ENABLE;
    
    // 内存
    dsdps.memory0_addr = (uint32_t)dst;
    // 增长
    dsdps.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
    // 数据长度
    dsdps.number = ARR_LEN;
    // 数据宽度
    dsdps.periph_memory_width = DMA_PERIPH_WIDTH_8BIT;
    dma_single_data_mode_init(DMA1, DMA_CH0, &dsdps);
}

void dma1_send()
{
    // 使能dma通道,
    dma_channel_enable(DMA1, DMA_CH0);
    while (RESET == dma_flag_get(DMA1, DMA_CH0, DMA_FLAG_FTF))
    {
        /* code */
    }
    dma_flag_clear(DMA1, DMA_CH0, DMA_FLAG_FTF);
}

void dma1_test(void)
{
    systick_config();

    dma1_config();
}
